Ciencia de Datos para Economistas

Clase 11- Trabajando con Data Frames-columnas

Autor/a
Afiliación

MSc. José M. Avendaño

Universidad Central de Venezuela- Escuela de Economía -2024

Fecha de publicación

20 de noviembre de 2024

Objetivo

Realizar manipulaciones a los datos contenidos en una DF según diversos criterios, en particular en operaciones que afectan a las columnas o atributos.

Operaciones en Columnas

A diferencia de las operaciones que revisamos en la Clase 10 donde aplicamos ciertas funciones para actuar sobre las filas, en esta oportunidad vamos a actuar sobre las columnas con una serie de funciones.

Revisar presentación e igualmente el qmd disponible en https://github.com/javendaXgh/r4dsucv2024/blob/main/clases/clase_11.qmd

Selección de Columnas

Se revisarán distintos métodos para seleccionar o deseleccionar columas de una data frame.

Select

Selecciona columnas de una DF

  1. Por nombre de las columnas:

    df_gapminder%>%
      select(country, year, lifeExp)%>%
      slice(1)
    # A tibble: 1 × 3
      country      year lifeExp
      <fct>       <int>   <dbl>
    1 Afghanistan  1952    28.8
  2. Por índice de la columna

    df_gapminder%>%
      select(1, 3, 4)%>%
      slice(1)
    # A tibble: 1 × 3
      country      year lifeExp
      <fct>       <int>   <dbl>
    1 Afghanistan  1952    28.8

select(-)

Uso de operador sustracción para no selección

  1. Por nombre

    df_gapminder%>%
      select(-continent, -gdpPercap, -continent, -pop )%>%
      slice(1)
    # A tibble: 1 × 3
      country      year lifeExp
      <fct>       <int>   <dbl>
    1 Afghanistan  1952    28.8
  2. Por índice

    df_gapminder%>%
      select(-c(2,5,6))%>%
      slice(1)
    # A tibble: 1 × 3
      country      year lifeExp
      <fct>       <int>   <dbl>
    1 Afghanistan  1952    28.8

select(!)

Deseleccionar usando el operador de negación !

  1. Por nombre

    df_gapminder%>%
      select(!c(continent, gdpPercap, pop))%>%
      slice(1)
    # A tibble: 1 × 3
      country      year lifeExp
      <fct>       <int>   <dbl>
    1 Afghanistan  1952    28.8
  2. Por índice

    df_gapminder%>%
      select(!c(2,5,6))%>%
      slice(1)
    # A tibble: 1 × 3
      country      year lifeExp
      <fct>       <int>   <dbl>
    1 Afghanistan  1952    28.8

Rename

Cambiar el nombre de una columna. Primero se coloca el nombre nuevo y luego el operador de igualdad y posteriormente el nombre que tiene actualmente la columna

df_gapminder%>%
  rename(anno=year, pais= country)%>%
  select(anno, pais)
# A tibble: 1,704 × 2
    anno pais       
   <int> <fct>      
 1  1952 Afghanistan
 2  1957 Afghanistan
 3  1962 Afghanistan
 4  1967 Afghanistan
 5  1972 Afghanistan
 6  1977 Afghanistan
 7  1982 Afghanistan
 8  1987 Afghanistan
 9  1992 Afghanistan
10  1997 Afghanistan
# ℹ 1,694 more rows

Mutate

Crear una nueva columna en una DF, en este caso una columna que calcula el PIB

df_gapminder_pib <- df_gapminder%>%
  mutate(pib= gdpPercap* pop)%>%
  select(country, year, pib)

head(df_gapminder_pib, 3)
# A tibble: 3 × 3
  country      year         pib
  <fct>       <int>       <dbl>
1 Afghanistan  1952 6567086330.
2 Afghanistan  1957 7585448670.
3 Afghanistan  1962 8758855797.

Mutate /ifelse

La función ifelse funciona vectorizadamente, es decir, se aplica sobre cada valor de una determinada fila de la data frame y su objetivo es evaluar si una determinada condición que es establecida se cumple o no, para un determinado valor.

La condición evaluada solo puede arrojar un valor verdadero (TRUE) o uno falso (FALSE). Si arroja un verdadero ocurrirá un suceso A y en caso de no cumplirse ocurrirá un suceso B.

Mutate /ifelse -cont.

La sintáxis es ifelse(condición a evaluar, ocurre A, ocurre b) , por ejemplo:

a <- 4

b <- 7

ifelse (a>b, "es mayor", "es menor")

dando de resultado la ejecución anterior “es menor” ya que al evaluar si 4 es mayor que 7, el resultado es FALSE y por lo tanto se irá al suceso B que es arrojar el valor “es menor”.

Mutate /ifelse- ejemplo- Planteamiento Problema

Vamos a estudiar cuáles países tienen un PIB por encima del promedio de los PIB´s para el año 2007. A los países que estén por encima les vamos a asignar una categoría que se llamará “pib_up_mean” y a los que estén por debajo otra que se llame “pib_down_mean”.

Primero creamos la DF con los valores que vamos a evaluar

Mutate /ifelse- ejemplo- crear DF

df_pib_2007 <- df_gapminder %>%
  filter(year==2007)%>%
  mutate(pib= gdpPercap* pop)%>%
  select(country, pib)

head(df_pib_2007, 2)
# A tibble: 2 × 2
  country              pib
  <fct>              <dbl>
1 Afghanistan 31079291949.
2 Albania     21376411360.

Mutate / ifelse - ejemplo - pasos intermedios

En caso de que los PIBs se presenten con notación exponencial o científica se hace el siguiente setting

options(scipen=999)

Igualmente vamos a evaluar cuál es el promedio del PIB y lo asignamos a la variable pib_promedio

pib_promedio =mean(df_pib_2007$pib)
pib_promedio
[1] 409220666999

Mutate / ifelse - ejemplo- Aplicar

La columna que vamos a crear se llama “tipo_pib”

df_pib_2007 <- df_pib_2007%>%
  mutate(tipo_pib =ifelse(pib>=pib_promedio, # condición a evaluar
                          "pib_up_mean", # caso verdadero => ocurre a
                          "pib_down_mean"))  #caso falso => ocurre b

df_pib_2007%>%
  sample_n(4)
# A tibble: 4 × 3
  country             pib tipo_pib     
  <fct>             <dbl> <chr>        
1 Ireland   167141167138. pib_down_mean
2 Guatemala  65203833292. pib_down_mean
3 Zimbabwe    5782658337. pib_down_mean
4 Greece    294834223727. pib_down_mean

Mutate / doble ifelse - problema

Ahora vamos a asignar tres categorías según el tamaño del PIB.

Condición Categoría a asignar
pib mayor a tercer cuantil ‘super_pib’
pib entre 1 er cuantil y 3 er cuantil ‘medio_pib’
pib por debajo de 1 er cuantil ‘bajo_pib’

Mutate /doble ifelse - pasos intermedios

Obtener cuantiles.

cuantiles_pib <- quantile(df_pib_2007$pib)

cuantiles_pib
            0%            25%            50%            75%           100% 
     319014077    17438491194    57869055458   275959963297 12934458535085 
#fijar variables
tercer_cuantil <- cuantiles_pib[4]
primer_cuantil <- cuantiles_pib[2]

Nota:

Nayuha, de forma apropiada investigó cuál función se usa para obtener estos valores quantile y cómo se pueden asignar a una variable, dado que la salida que genera la función summary no es maleable para extraer datos individuales como los valores asociados a un cuantil u otro.

🙌🏼

Mutate /doble ifelse - ejemplo 2- Aplicar

df_pib_2007 <- df_pib_2007%>%
  arrange(desc(pib))%>%
  mutate(tipo_pib2 =ifelse(pib<= primer_cuantil, # condición a evaluar
                          "bajo_pib",# caso verdadero => ocurre a
                          ifelse(pib>= tercer_cuantil, # caso falso => ocurre b y lleva a una 2da eval
                                 'super_pib', # caso verdadero => ocurre b-a
                                 'medio_pib') # caso falso => ocurre b-b
                          )
         )

head(df_pib_2007,3)
# A tibble: 3 × 4
  country           pib tipo_pib    tipo_pib2
  <fct>           <dbl> <chr>       <chr>    
1 United States 1.29e13 pib_up_mean super_pib
2 China         6.54e12 pib_up_mean super_pib
3 Japan         4.04e12 pib_up_mean super_pib

Tablas Sumarios e Histograma

table(df_pib_2007$tipo_pib)

pib_down_mean   pib_up_mean 
          117            25 
table(df_pib_2007$tipo_pib2)

 bajo_pib medio_pib super_pib 
       36        70        36 

Histograma

hist (df_pib_2007$pib/1000000,
      col = 4,
      breaks=20,
      main = "Histograma PIB Países", 
      xlab = "Valor PIB", 
      ylab = "Frecuencia")

Explorar Países con mayor PIB

head(df_pib_2007,10)
# A tibble: 10 × 4
   country            pib tipo_pib    tipo_pib2
   <fct>            <dbl> <chr>       <chr>    
 1 United States  1.29e13 pib_up_mean super_pib
 2 China          6.54e12 pib_up_mean super_pib
 3 Japan          4.04e12 pib_up_mean super_pib
 4 India          2.72e12 pib_up_mean super_pib
 5 Germany        2.65e12 pib_up_mean super_pib
 6 United Kingdom 2.02e12 pib_up_mean super_pib
 7 France         1.86e12 pib_up_mean super_pib
 8 Brazil         1.72e12 pib_up_mean super_pib
 9 Italy          1.66e12 pib_up_mean super_pib
10 Mexico         1.30e12 pib_up_mean super_pib

Explorar Países con menor PIB

df_pib_2007%>%
  slice_tail(n=10)
# A tibble: 10 × 4
   country                          pib tipo_pib      tipo_pib2
   <fct>                          <dbl> <chr>         <chr>    
 1 Burundi                  3608510288. pib_down_mean bajo_pib 
 2 Lesotho                  3158513357. pib_down_mean bajo_pib 
 3 Eritrea                  3146934084. pib_down_mean bajo_pib 
 4 Central African Republic 3084613079. pib_down_mean bajo_pib 
 5 Liberia                  1323912407. pib_down_mean bajo_pib 
 6 Gambia                   1270911775. pib_down_mean bajo_pib 
 7 Djibouti                 1033689705. pib_down_mean bajo_pib 
 8 Guinea-Bissau             852652874. pib_down_mean bajo_pib 
 9 Comoros                   701111696. pib_down_mean bajo_pib 
10 Sao Tome and Principe     319014077. pib_down_mean bajo_pib 

Explorar Países con medio PIB

Muestra aleatoria

df_pib_2007%>%
  filter(tipo_pib2== 'medio_pib')%>%
  sample_n(8)
# A tibble: 8 × 4
  country              pib tipo_pib      tipo_pib2
  <fct>              <dbl> <chr>         <chr>    
1 Panama      31803076821. pib_down_mean medio_pib
2 Chad        17447579586. pib_down_mean medio_pib
3 Finland    173953983346. pib_down_mean medio_pib
4 Cuba       102160374747. pib_down_mean medio_pib
5 Vietnam    208174556559. pib_down_mean medio_pib
6 Madagascar  20025792285. pib_down_mean medio_pib
7 Tunisia     72887997687. pib_down_mean medio_pib
8 Guatemala   65203833292. pib_down_mean medio_pib

Asignación a un Nuevo Objeto

Todas las operaciones realizadas anteriormente, tiene sentido asignarlas a un nuevo objeto, ya que se está modificando la estructura de los datos de entrada con los que estamos trabando. P.ej:

df_gap_pib <- df_gapminder%>%
  mutate(pib= gdpPercap* pop) %>%
  rename(pais= country, anno=year) %>%
  select(pais, anno, pib)

head(df_gap_pib, 2)
# A tibble: 2 × 3
  pais         anno         pib
  <fct>       <int>       <dbl>
1 Afghanistan  1952 6567086330.
2 Afghanistan  1957 7585448670.

Lecturas Recomendadas:

  • Capítulo 4 R4DS (temas pasados referente a variables y operaciones básicas)

  • Capítulo 5 R4DS: comparaciones, operadores lógicos, arrange, select, mutate, summarise, pipe operator. En el capítulo se tratan los valores faltantes NA que luego serán abordados